use sea_orm::{DeriveEntityModel, DeriveRelation, EnumIter};
use serde::{Deserialize, Serialize};

#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "t_blog")]
pub struct Model {
    // 复合主键
    #[sea_orm(primary_key)]
    pub user_id: String,
    #[sea_orm(primary_key)]
    pub menu_id: String,
}

/// 用户和菜单的关联表，一个用户可以有多个菜单，一个菜单也可以被多个用户拥有。因此，用户和菜单之间属于多对多的关联关系。
/// 参考 sea-orm 官方网站： https://www.sea-ql.org/SeaORM/docs/relation/many-to-many
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
    // 可以通过D DeriveRelation 宏缩短定义，其中以下内容消除了对上述 RelationsTrait 实现的需要：
    #[sea_orm(
        belongs_to = "super::user::Entity",
        from = "Column::UserId",
        to = "super::user::Column::UserId"
    )]
    User,
    #[sea_orm(
        belongs_to = "super::menu::Entity",
        from = "Column::MenuId",
        to = "super::menu::Column::MenuId"
    )]
    Menu,
}

// 使用 DeriveRelation 宏定义，实现了上面的 Relation 效果等同于以下代码： 这样可以省去手动实现 RelationTrait 了。大大减少了代码量。
/*

#[derive(Copy, Clone, Debug, EnumIter)]
pub enum Relation {
    Cake,
    Filling,
}

impl RelationTrait for Relation {
    fn def(&self) -> RelationDef {
        match self {
            Self::Cake => Entity::belongs_to(super::cake::Entity)
                .from(Column::CakeId)
                .to(super::cake::Column::Id)
                .into(),
            Self::Filling => Entity::belongs_to(super::filling::Entity)
                .from(Column::FillingId)
                .to(super::filling::Column::Id)
                .into(),
        }
    }
}

*/